﻿using System;
using Protocolo.Mensajes;

namespace Servidor
{
    class Program
    {
        public static void Consola(Controlador con)
        {
            Console.WriteLine("--------------------------------------------------------");
            Console.WriteLine("----              CONSOLA DEL SERVIDOR              ----");
            Console.WriteLine("--------------------------------------------------------");
            Console.WriteLine("Digite: ");
            Console.WriteLine(" c: Conectar");
            Console.WriteLine(" s: Ver Lista Servidores");
            Console.WriteLine(" a: Ver Lista Archivos");
            Console.WriteLine(" b: Ver Informacion Ancho de Banda");
            Console.WriteLine(" h: Ayuda");
            Console.WriteLine(" x: Salir");
            Console.WriteLine("--------------------------------------------------------");
            bool showMenu = true;
            while (showMenu)
            {
                ConsoleKeyInfo cki = Console.ReadKey();
                Console.WriteLine();
                switch (cki.KeyChar)
                {
                    case 'x':
                        Console.WriteLine();
                        Console.WriteLine("Fin de la aplicación");
                        showMenu = false;
                        con.CerrarConexion();
                        break;
                    case 'c':
                        try
                        {
                            con.IniciarProcesos();
                            Console.WriteLine();
                            Utilities.LogExito("Conexión realizada con exito");
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine();
                            Utilities.LogError(string.Format("Ocurrio un error al intentar conectar: {0}", ex.Message));
                        }
                        break;
                    case 's':
                        Console.WriteLine();
                        Utilities.LogInformacion("--------------------------------------------------------");
                        Utilities.LogInformacion("        Lista de servidores y su ancho de banda         ");
                        Console.WriteLine();
                        foreach(string servidor in DatosServidor.Instancia.Servidores_AnchoDeBanda.Keys)
                        {
                            Utilities.LogInformacion(string.Format("IP: {0} - Ancho de Banda: {1}", servidor, DatosServidor.Instancia.Servidores_AnchoDeBanda[servidor].AnchoDeBanda));
                        }
                        Console.WriteLine();
                        Utilities.LogInformacion("--------------------------------------------------------");
                        break;
                    case 'a':
                        Console.WriteLine();
                        Utilities.LogInformacion("--------------------------------------------------------");
                        Utilities.LogInformacion("            Lista de archivos del servidor              ");
                        Console.WriteLine();
                        foreach (string archivo in DatosServidor.Instancia.Archivos_MD5.Keys)
                        {
                            Utilities.LogInformacion(string.Format("Nombre: {0} - MD5: {1}", archivo, DatosServidor.Instancia.Archivos_MD5[archivo]));
                        }
                        Console.WriteLine();
                        Utilities.LogInformacion("--------------------------------------------------------");
                        break;
                    case 'b':
                        Console.WriteLine();
                        Utilities.LogInformacion("--------------------------------------------------------");
                        Utilities.LogInformacion("              Informacion Ancho de banda                ");
                        Console.WriteLine();
                        Utilities.LogInformacion(string.Format("Maximo ancho de banda por cliente: {0} KB/s", DatosServidor.Instancia.AnchoDeBandaServidor.AnchoDeBandaXCliente));
                        Utilities.LogInformacion(string.Format("Maximo ancho de banda total:       {0} KB/s", DatosServidor.Instancia.AnchoDeBandaServidor.AnchoDeBandaTotal));
                        Utilities.LogInformacion(string.Format("Ancho de banda disponible:         {0} KB/s", DatosServidor.Instancia.AnchoDeBandaServidor.AnchoDeBandaDisponible));
                        Utilities.LogInformacion(string.Format("Ancho de banda consumido:          {0} KB/s", DatosServidor.Instancia.AnchoDeBandaServidor.AnchoDeBandaConsumido));
                                                
                        Console.WriteLine();
                        foreach (string cliente in DatosServidor.Instancia.AnchoDeBandaServidor.AnchoDeBandaClientes.Keys)
                        {
                            Utilities.LogInformacion(string.Format("IP Cliente: {0} - Ancho de banda consumido: {1} KB/s", cliente, DatosServidor.Instancia.AnchoDeBandaServidor.ObtenerAnchoDeBandaConsumidoCliente(cliente)));
                        }
                        Console.WriteLine();
                        Utilities.LogInformacion("--------------------------------------------------------");
                        break;
                    case 'h':
                        Console.WriteLine();
                        Console.WriteLine("--------------------------------------------------------");
                        Console.WriteLine("Digite: ");
                        Console.WriteLine(" c: Conectar");
                        Console.WriteLine(" s: Ver Lista Servidores");
                        Console.WriteLine(" a: Ver Lista Archivos");
                        Console.WriteLine(" b: Ver Informacion Ancho de Banda");
                        Console.WriteLine(" h: Ayuda");
                        Console.WriteLine(" x: Salir");
                        Console.WriteLine("--------------------------------------------------------");
                        break;
                    default:
                        Console.WriteLine();
                        Console.WriteLine("Opción invalida, digite 'h'");
                        break;
                }
            }
        }

        public static void Main(string[] args)
        {
            try
            {
                Consola(Controlador.Instancia);
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Utilities.LogError("Error general: " + ex.Message);
            }
        }

    }
}
